package gob.osinerg.emergencia.action;

import gob.osinerg.emergencia.bean.AccidenteGraveFinal;
import gob.osinerg.emergencia.bean.AccidenteGraveFinalTestigo;
import gob.osinerg.emergencia.bean.AccidenteLeve;
import gob.osinerg.emergencia.bean.Actividad;
import gob.osinerg.emergencia.bean.ActividadBean;
import gob.osinerg.emergencia.bean.EmergenciaOperativaFinal;
import gob.osinerg.emergencia.bean.EmergenciaOperativaFinalAccionesCorrectivas;
import gob.osinerg.emergencia.bean.EmergenciaOperativaFinalCausas;
import gob.osinerg.emergencia.bean.EmergenciaOperativaFinalMedidasSeguridad;
import gob.osinerg.emergencia.bean.EmergenciaOperativaFinalTestigo;
import gob.osinerg.emergencia.bean.EmergenciaOperativaPreliminar;
import gob.osinerg.emergencia.bean.FormularioEmergenciaUnmay;
import gob.osinerg.emergencia.bean.SiniestroFinal;
import gob.osinerg.emergencia.bean.SiniestroPreliminar;
import gob.osinerg.emergencia.bean.UnidadOperativaBean;
import gob.osinerg.emergencia.bean.UsuarioBean;
import gob.osinerg.emergencia.form.AccidenteGraveFinalForm;
import gob.osinerg.emergencia.form.AccidenteLeveForm;
import gob.osinerg.emergencia.form.EmergenciaOperativaFinalForm;
import gob.osinerg.emergencia.form.EmergenciaOperativaPreliminarForm;
import gob.osinerg.emergencia.service.EmergenciaOperativaFinalService;
import gob.osinerg.emergencia.service.EmergenciaOperativaPreliminarService;
import gob.osinerg.emergencia.service.GenericService;
import gob.osinerg.emergencia.util.Report;
import gob.osinerg.emergencia.util.Constants;

import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.util.ResourceUtils;

//import com.sun.rsasign.v;

public class EmergenciaOperativaFinalAction extends GenericAction {


	private Log log = LogFactory.getLog(EmergenciaOperativaFinalAction.class);

	private EmergenciaOperativaFinalService service;	
	private GenericService genericService;

	public ActionForward preinicio(ActionMapping actionMapping,
			ActionForm actionForm, HttpServletRequest request,
			HttpServletResponse response) throws java.lang.Exception {
		HttpSession session = request.getSession();
		UsuarioBean usuario = (UsuarioBean) session.getAttribute("UsuarioBean");
		
//		List listaEmergenciaPreliminar = service.findFormEmergenciaUnmay(usuario.getCodigoLogin(), new Long(3));
//		request.setAttribute(Constants.LISTA_EMERGENCIA_OPERATIVA_PRELIMINAR, listaEmergenciaPreliminar);

		List listaEmergenciaPreliminar = service.findEmergenciaOperativaPreliminar(usuario.getCodigoLogin(), new Long(3));
		request.setAttribute(Constants.LISTA_EMERGENCIA_OPERATIVA_PRELIMINAR, listaEmergenciaPreliminar);
		
//		SE RETIRO PORQUE AHORA SE ACCEDE DESDE EL MENU
//		List listaEmergenciaFinal = service.findEmergenciaOperativaFinal(usuario.getCodigoLogin(), new Long(4));
//		request.setAttribute(Constants.LISTA_EMERGENCIA_OPERATIVA_FINAL, listaEmergenciaFinal);
		
		EmergenciaOperativaFinalForm form = (EmergenciaOperativaFinalForm) actionForm;
		form.setBean(new EmergenciaOperativaFinal());
		
		return actionMapping.findForward("preinicio");
	}
	
	public ActionForward inicio(ActionMapping actionMapping,
			ActionForm actionForm, HttpServletRequest request,
			HttpServletResponse response) throws java.lang.Exception {
		FormularioEmergenciaUnmay emergenciaPreUnmay = null;
		
		EmergenciaOperativaFinalForm form = (EmergenciaOperativaFinalForm) actionForm;
		form.setListaCausas(new ArrayList());
		form.setListaMedidasSeguridad(new ArrayList());
		form.setListaAccionesCorrectivas(new ArrayList());
		form.setListaTestigosAccidente(new ArrayList());
		EmergenciaOperativaFinal bean = (EmergenciaOperativaFinal) form.getBean();
		
		System.out.println("(1)preliminar.id:"+bean.getPreliminar().getId());
		EmergenciaOperativaPreliminar preliminar = service.findEmergenciaPreliminar(bean.getPreliminar().getId());
		System.out.println("(2)preliminar.IdFormularioEmergencia:"+bean.getPreliminar().getIdFormularioEmergencia());
		emergenciaPreUnmay = (FormularioEmergenciaUnmay)genericService.findById(FormularioEmergenciaUnmay.class, preliminar.getIdFormularioEmergencia());
		
		//System.out.println("(3)siniestroPreUnmay.id:"+emergenciaPreUnmay.getId());
		preliminar.setRegistroDgh(emergenciaPreUnmay.getRegistroDgh());
		
		//bean.setPreliminar(bean.getPreliminar());
		//bean.setRegistroDgh(bean.getPreliminar().getRegistroDgh());
		//bean.setLocacion(bean.getPreliminar().getLocacion());
		
		// CARGAR DATOS DESDEL PRELIMINAR AL FINAL
		bean.setId(null);
		bean.setPreliminar(preliminar);
		bean.setRegistroDgh(emergenciaPreUnmay.getRegistroDgh());
		bean.setLocacion(preliminar.getLocacion());
		bean.setFecha(preliminar.getFecha());
		bean.setHoraInicio(preliminar.getHoraSiniestro());
		bean.setLugarEmergencia(preliminar.getLugarEmergencia());
		bean.setDescripcionEmergencia(preliminar.getDescripcionEmergencia());
		bean.setDanosMateriales(preliminar.getDanosMateriales());
		bean.setIsesNombre(preliminar.getIsesNombre());
		bean.setRlNombre(preliminar.getRlNombre());
		bean.setIsesDni(preliminar.getIsesDni());
		bean.setRlDni(preliminar.getRlDni());
		bean.setIsesRegistroCip(preliminar.getIsesRegistroCip());

		Date now = new Date();
		DateFormat df =  DateFormat.getDateInstance();
		String s =  df.format(now);
		bean.setStrFechaEmision(s);
		
		//bean.setFecha(bean.getPreliminar().getFecha());
		form.setBean(bean);
		return actionMapping.findForward("inicio");
	}
	
	public ActionForward cargar(ActionMapping actionMapping,
			ActionForm actionForm, HttpServletRequest request,
			HttpServletResponse response) throws java.lang.Exception {
		
		//FormularioEmergenciaUnmay emergenciaPreUnmay = null;
		EmergenciaOperativaFinalForm form = (EmergenciaOperativaFinalForm) actionForm;
		EmergenciaOperativaFinal bean = (EmergenciaOperativaFinal) form.getBean();
		
		HttpSession session = request.getSession();
		Long idFormulario = (Long) session.getAttribute("idEmergenciaOperativaFinal");
		
		Long idEmergenciaOperativaFinal = service.obtenerIdEmergenciaOperativaFinal(idFormulario);
		
		
		EmergenciaOperativaFinal ef = service.findEmergenciaFinal(idEmergenciaOperativaFinal);
		
		if(ef.getListaCausas()==null){
			form.setListaCausas(new ArrayList());
			ef.setHayCausas(null);
		}else {
			form.setListaCausas(ef.getListaCausas());
			if(ef.getListaCausas().isEmpty()){
				ef.setHayCausas(null);
			} else {
				ef.setHayCausas("SI");
			}
		}
		if(ef.getListaMedidasSeguridad()==null){
			form.setListaMedidasSeguridad(new ArrayList());
			ef.setHayMedidasSeguridad(null);
		}else {
			form.setListaMedidasSeguridad(ef.getListaMedidasSeguridad());
			if(ef.getListaMedidasSeguridad().isEmpty()){
				ef.setHayMedidasSeguridad(null);
			} else {
				ef.setHayMedidasSeguridad("SI");
			}
		}
		if(ef.getListaAccionesCorrectivas()==null){
			form.setListaAccionesCorrectivas(new ArrayList());
			ef.setHayAccionesCorrectivas(null);
		}else {
			form.setListaAccionesCorrectivas(ef.getListaAccionesCorrectivas());
			if(ef.getListaAccionesCorrectivas().isEmpty()) {
				ef.setHayAccionesCorrectivas(null);
			}else {
				ef.setHayAccionesCorrectivas("SI");
			}
		}
		if(ef.getListaTestigosAccidente()==null){
			form.setListaTestigosAccidente(new ArrayList());
			ef.setHayTestigos(null);
		}else {
			form.setListaTestigosAccidente(ef.getListaTestigosAccidente());
			if(ef.getListaTestigosAccidente().isEmpty()){
				ef.setHayTestigos(null);
			}else {
				ef.setHayTestigos("SI");
			}
		}

		form.setBean(ef); // CONTINUAR ACA
		
		return actionMapping.findForward("inicio");
	}
	
	
	public ActionForward agregarTestigo(ActionMapping actionMapping,
			ActionForm actionForm, HttpServletRequest request,
			HttpServletResponse response) throws java.lang.Exception {
		System.out.println("Ingresando a agregarTestigo");
		EmergenciaOperativaFinalTestigo eoft=new EmergenciaOperativaFinalTestigo();
		EmergenciaOperativaFinalForm form = (EmergenciaOperativaFinalForm) actionForm;
		eoft.setNombresApellidos(((EmergenciaOperativaFinal)form.getBean()).getNombreApellidosTestigo1());
		eoft.setEdad(((EmergenciaOperativaFinal)form.getBean()).getEdadTestigo1());
		eoft.setOcupacion(((EmergenciaOperativaFinal)form.getBean()).getOcupacionTestigo1());
		((EmergenciaOperativaFinal)form.getBean()).setNombreApellidosTestigo1("");
		((EmergenciaOperativaFinal)form.getBean()).setEdadTestigo1("");
		((EmergenciaOperativaFinal)form.getBean()).setOcupacionTestigo1("");
		((EmergenciaOperativaFinal)form.getBean()).setHayTestigos("SI");
		if(form.getListaTestigosAccidente() == null) { form.setListaTestigosAccidente(new ArrayList()); }
		form.getListaTestigosAccidente().add(eoft);
		
		return actionMapping.findForward("inicio");
	}
	
	public ActionForward eliminarTestigo(ActionMapping actionMapping,
			ActionForm actionForm, HttpServletRequest request,
			HttpServletResponse response) throws java.lang.Exception {
		EmergenciaOperativaFinalForm form = (EmergenciaOperativaFinalForm) actionForm;
		System.out.println("Ingresando a eliminarTestigo");
				
		for(int i=0; i<form.getListaTestigosAccidente().size();i++){			
			if( i == ((EmergenciaOperativaFinal)form.getBean()).getIndexEliminar().intValue() ){
				form.getListaTestigosAccidente().remove(i);
			}
		}
		if(form.getListaTestigosAccidente().size()==0) {
			((EmergenciaOperativaFinal)form.getBean()).setHayTestigos(null);
		}

		return actionMapping.findForward("inicio");
	}
	public ActionForward agregarCausaEmergencia(ActionMapping actionMapping,
			ActionForm actionForm, HttpServletRequest request,
			HttpServletResponse response) throws java.lang.Exception {
		System.out.println("Ingresando a agregarCausas");
		EmergenciaOperativaFinalCausas eoft=new EmergenciaOperativaFinalCausas();
		EmergenciaOperativaFinalForm form = (EmergenciaOperativaFinalForm) actionForm;
		eoft.setDescripcion(((EmergenciaOperativaFinal)form.getBean()).getCausasEmergencia());
		((EmergenciaOperativaFinal)form.getBean()).setCausasEmergencia("");
		((EmergenciaOperativaFinal)form.getBean()).setHayCausas("SI");
		if(form.getListaCausas() == null) { form.setListaCausas(new ArrayList()); }
		form.getListaCausas().add(eoft);
		
		return actionMapping.findForward("inicio");
	}
	
	public ActionForward eliminarCausaEmergencia(ActionMapping actionMapping,
			ActionForm actionForm, HttpServletRequest request,
			HttpServletResponse response) throws java.lang.Exception {
		EmergenciaOperativaFinalForm form = (EmergenciaOperativaFinalForm) actionForm;
		System.out.println("Ingresando a eliminarCausas");
				
		for(int i=0; i<form.getListaCausas().size();i++){			
			if( i == ((EmergenciaOperativaFinal)form.getBean()).getIndexEliminar().intValue() ){
				form.getListaCausas().remove(i);
			}
		}
		if(form.getListaCausas().size()==0){
			((EmergenciaOperativaFinal)form.getBean()).setHayCausas(null);
		}

		return actionMapping.findForward("inicio");
	}
	
	public ActionForward agregarMedidasSeguridad(ActionMapping actionMapping,
			ActionForm actionForm, HttpServletRequest request,
			HttpServletResponse response) throws java.lang.Exception {
		System.out.println("Ingresando a agregarMedidasSeguridad");
		EmergenciaOperativaFinalMedidasSeguridad eoft=new EmergenciaOperativaFinalMedidasSeguridad();
		EmergenciaOperativaFinalForm form = (EmergenciaOperativaFinalForm) actionForm;
		eoft.setDescripcion(((EmergenciaOperativaFinal)form.getBean()).getMedidasSeguridad());
		((EmergenciaOperativaFinal)form.getBean()).setMedidasSeguridad("");
		((EmergenciaOperativaFinal)form.getBean()).setHayMedidasSeguridad("SI");
		if(form.getListaMedidasSeguridad() == null) { form.setListaMedidasSeguridad(new ArrayList()); }
		form.getListaMedidasSeguridad().add(eoft);
		
		return actionMapping.findForward("inicio");
	}
	
	public ActionForward eliminarMedidasSeguridad(ActionMapping actionMapping,
			ActionForm actionForm, HttpServletRequest request,
			HttpServletResponse response) throws java.lang.Exception {
		EmergenciaOperativaFinalForm form = (EmergenciaOperativaFinalForm) actionForm;
		System.out.println("Ingresando a eliminarMedidasSeguridad");
				
		for(int i=0; i<form.getListaMedidasSeguridad().size();i++){			
			if( i == ((EmergenciaOperativaFinal)form.getBean()).getIndexEliminar().intValue() ){
				form.getListaMedidasSeguridad().remove(i);
			}
		}
		if(form.getListaMedidasSeguridad().size()==0){
			((EmergenciaOperativaFinal)form.getBean()).setHayMedidasSeguridad(null);
		}

		return actionMapping.findForward("inicio");
	}

	public ActionForward agregarAccionesCorrectivas(ActionMapping actionMapping,
			ActionForm actionForm, HttpServletRequest request,
			HttpServletResponse response) throws java.lang.Exception {
		System.out.println("Ingresando a agregarAccionesCorrectivas");
		EmergenciaOperativaFinalAccionesCorrectivas eoft=new EmergenciaOperativaFinalAccionesCorrectivas();
		EmergenciaOperativaFinalForm form = (EmergenciaOperativaFinalForm) actionForm;
		eoft.setDescripcion(((EmergenciaOperativaFinal)form.getBean()).getAccionesCorrectivas());
		((EmergenciaOperativaFinal)form.getBean()).setAccionesCorrectivas("");
		((EmergenciaOperativaFinal)form.getBean()).setHayAccionesCorrectivas("SI");
		if(form.getListaAccionesCorrectivas() == null) { form.setListaAccionesCorrectivas(new ArrayList()); }
		form.getListaAccionesCorrectivas().add(eoft);
		
		return actionMapping.findForward("inicio");
	}
	
	public ActionForward eliminarAccionesCorrectivas(ActionMapping actionMapping,
			ActionForm actionForm, HttpServletRequest request,
			HttpServletResponse response) throws java.lang.Exception {
		EmergenciaOperativaFinalForm form = (EmergenciaOperativaFinalForm) actionForm;
		System.out.println("Ingresando a eliminarAccionesCorrectivas");
				
		for(int i=0; i<form.getListaAccionesCorrectivas().size();i++){			
			if( i == ((EmergenciaOperativaFinal)form.getBean()).getIndexEliminar().intValue() ){
				form.getListaAccionesCorrectivas().remove(i);
			}
		}
		if(form.getListaAccionesCorrectivas().size()==0){
			((EmergenciaOperativaFinal)form.getBean()).setHayAccionesCorrectivas(null);
		}
		return actionMapping.findForward("inicio");
	}

	public ActionForward doGuardarAvances(ActionMapping actionMapping,
			ActionForm actionForm, HttpServletRequest request,
			HttpServletResponse response) throws java.lang.Exception {
		EmergenciaOperativaFinalForm form = (EmergenciaOperativaFinalForm) actionForm;
		EmergenciaOperativaFinal bean = (EmergenciaOperativaFinal) form.getBean();
		bean.setFlagTemporal("SI");
		return doSave(actionMapping, actionForm, request, response); 
	}
	
	public ActionForward doSave(ActionMapping actionMapping,
			ActionForm actionForm, HttpServletRequest request,
			HttpServletResponse response) throws java.lang.Exception {

		EmergenciaOperativaFinalForm form = (EmergenciaOperativaFinalForm) actionForm;

		String message = "messages.insert.successful";
		try {
			// Seteando valores formulario Nro6
			Date fecha=new Date();
			SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
			String cadenaFecha = formato.format(fecha);

			EmergenciaOperativaFinal bean = (EmergenciaOperativaFinal) form.getBean();
			FormularioEmergenciaUnmay beanform = new FormularioEmergenciaUnmay();
			HttpSession session = request.getSession();
			UnidadOperativaBean unidadOperativa = (UnidadOperativaBean) session.getAttribute("UnidadOperativaBean");
			UsuarioBean usuario = (UsuarioBean) session.getAttribute("UsuarioBean");
			ActividadBean actividad=(ActividadBean)session.getAttribute("ActividadBean");
			Long idUnidadOperativa = Long.valueOf(unidadOperativa.getCodigo());
			
			//Seteando valores formulario emergencia unmay
			if(bean.getIdFormularioEmergencia()== null) {
				// CUANDO EL FORMULARIO ES NUEVO
				beanform.setId(null);
				beanform.setUniopeId(idUnidadOperativa);
				beanform.setCdgoOsinerg(unidadOperativa.getCodigoOsinerg());
				beanform.setRegistroDgh(bean.getPreliminar().getRegistroDgh());
				beanform.setFrmlarioId(new Long(6));
				beanform.setTpoEmrgncia("EOP");
				beanform.setEstado("GE");
				beanform.setMdioInfrmtvo("SEM");
				beanform.setActiviId(new Long(actividad.getCodigo()));
				beanform.setFchaEmrgncia(bean.getPreliminar().getFechaSiniestro());
				beanform.setUsrioCrdor(usuario.getCodigoLogin());
				beanform.setFchaCrcion(new Date());
			}else {
				// CUANDO SE CARGA UN FORMATO YA EXISTENTE
				beanform = service.findFormularioEmergenciaUnMay(bean.getIdFormularioEmergencia());
				beanform.setFchaMdfccion(new Date());
			}
			bean.setIdEmergenciaOperativa(bean.getPreliminar().getId());
			bean.setUsrioCrdor(usuario.getCodigoLogin());
			bean.setFchaCrcion(new Date());
			bean.setStrFechaEmision(cadenaFecha);

			bean.setListaTestigosAccidente(form.getListaTestigosAccidente());
			bean.setListaCausas(form.getListaCausas());
			bean.setListaMedidasSeguridad(form.getListaMedidasSeguridad());
			bean.setListaAccionesCorrectivas(form.getListaAccionesCorrectivas());
			
			service.save(bean, beanform);
			sendSuccessfulMessage(request, message);
			
			if(bean.getId()!=null) {
				//cargar(actionMapping, actionForm, request, response); // para probar en vez de raelizar todas las lineas de abajo 
				bean = service.findEmergenciaFinal(bean.getId());
				
				//EmergenciaOperativaPreliminar preliminar = service.findEmergenciaPreliminar(bean.getPreliminar().getId());
				//bean.setPreliminar(preliminar);
				
				form.setListaCausas(bean.getListaCausas());
				if(bean.getListaCausas() != null && !bean.getListaCausas().isEmpty()) {
					bean.setHayCausas("SI");
				}
				form.setListaMedidasSeguridad(bean.getListaMedidasSeguridad());
				if(bean.getListaMedidasSeguridad()!=null && !bean.getListaMedidasSeguridad().isEmpty()) {
					bean.setHayMedidasSeguridad("SI");
				}
				form.setListaTestigosAccidente(bean.getListaTestigosAccidente());
				if(bean.getListaTestigosAccidente()!=null && !bean.getListaTestigosAccidente().isEmpty()){
					bean.setHayTestigos("SI");
				}
				form.setListaAccionesCorrectivas(bean.getListaAccionesCorrectivas());
				if(bean.getListaAccionesCorrectivas()!=null && !bean.getListaAccionesCorrectivas().isEmpty()){
					bean.setHayAccionesCorrectivas("SI");
				}
				form.setBean(bean);
			}
			
		} catch (Exception ex) {
			log.error(ex.getMessage());
			ex.printStackTrace();
			message = "errors.update.failed.finalParam";
			throw new Exception(ex.getMessage());
		}

		return actionMapping.findForward("inicio");
	}
	
	public ActionForward exportar(ActionMapping mapping, ActionForm actionForm,
            HttpServletRequest request, HttpServletResponse response) throws Exception {
    	
	 EmergenciaOperativaFinalForm form = (EmergenciaOperativaFinalForm)actionForm;

    	try{
            request.setAttribute("actionReport","reporteEmergenciaOperativaFinal.do");
            HttpSession session = request.getSession();
    		String eopid = ((EmergenciaOperativaFinal)form.getBean()).getId()+"";
    		System.out.println("eofid: "+eopid);
            
            File archivo = ResourceUtils.getFile("classpath:gob/osinerg/emergencia/resource/jrxml/ReporteEmergenciaOperativaFinal.jrxml");
            
            Map parameters = new HashMap();
            parameters.put("ID", eopid);
            parameters.put("IMAGE_LOGO", request.getRequestURL().substring(0, request.getRequestURL().lastIndexOf("/"))+"/images/logo_home.jpg");
            parameters.put("SUBREPORT_DIR", archivo.getPath().substring(0,archivo.getPath().lastIndexOf(archivo.separator))+ archivo.separator);
    		
    		Report report = new Report();
    		report.setJasperReport(archivo);
    		report.setParameter(parameters);
    		report.setConnection(genericService.getConnection());
			report.PDF(request, response);   		
		
    	}catch(Exception ex){
    		log.error(ex.getMessage());
    	}
        return null;
    }	

	
	public void setGenericService(GenericService genericService) {
		this.genericService = genericService;
	}

	public void setService(EmergenciaOperativaFinalService service) {
		this.service = service;
	}

}
